{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# LightGBM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "feats:['Mch', 'npron', 'Nhhe', 'ETL', 'Erat', 'Nmeanpt', 'meanphhept']\n",
      "fold 0\n",
      "[LightGBM] [Warning] min_data_in_leaf is set=10, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=10\n",
      "Training until validation scores don't improve for 30 rounds\n",
      "[100]\ttraining's rmse: 1.84809\tvalid_1's rmse: 1.82526\n",
      "[200]\ttraining's rmse: 1.69433\tvalid_1's rmse: 1.67416\n",
      "[300]\ttraining's rmse: 1.55631\tvalid_1's rmse: 1.53868\n",
      "[400]\ttraining's rmse: 1.43281\tvalid_1's rmse: 1.41762\n",
      "[500]\ttraining's rmse: 1.32257\tvalid_1's rmse: 1.3097\n",
      "[600]\ttraining's rmse: 1.22439\tvalid_1's rmse: 1.21375\n",
      "[700]\ttraining's rmse: 1.13726\tvalid_1's rmse: 1.12875\n",
      "[800]\ttraining's rmse: 1.06014\tvalid_1's rmse: 1.05365\n",
      "[900]\ttraining's rmse: 0.992147\tvalid_1's rmse: 0.98757\n",
      "[1000]\ttraining's rmse: 0.932389\tvalid_1's rmse: 0.929586\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's rmse: 0.932389\tvalid_1's rmse: 0.929586\n",
      "fold 1\n",
      "[LightGBM] [Warning] min_data_in_leaf is set=10, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=10\n",
      "[100]\ttraining's rmse: 1.84505\tvalid_1's rmse: 1.85392\n",
      "[200]\ttraining's rmse: 1.69173\tvalid_1's rmse: 1.69991\n",
      "[300]\ttraining's rmse: 1.55404\tvalid_1's rmse: 1.56148\n",
      "[400]\ttraining's rmse: 1.43087\tvalid_1's rmse: 1.43768\n",
      "[500]\ttraining's rmse: 1.32093\tvalid_1's rmse: 1.32724\n",
      "[600]\ttraining's rmse: 1.22307\tvalid_1's rmse: 1.22899\n",
      "[700]\ttraining's rmse: 1.1362\tvalid_1's rmse: 1.14178\n",
      "[800]\ttraining's rmse: 1.05932\tvalid_1's rmse: 1.06458\n",
      "[900]\ttraining's rmse: 0.991553\tvalid_1's rmse: 0.996527\n",
      "[1000]\ttraining's rmse: 0.932014\tvalid_1's rmse: 0.936746\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's rmse: 0.932014\tvalid_1's rmse: 0.936746\n",
      "fold 2\n",
      "[LightGBM] [Warning] min_data_in_leaf is set=10, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=10\n",
      "[100]\ttraining's rmse: 1.84556\tvalid_1's rmse: 1.8488\n",
      "[200]\ttraining's rmse: 1.69221\tvalid_1's rmse: 1.69481\n",
      "[300]\ttraining's rmse: 1.55454\tvalid_1's rmse: 1.55661\n",
      "[400]\ttraining's rmse: 1.43137\tvalid_1's rmse: 1.43287\n",
      "[500]\ttraining's rmse: 1.32142\tvalid_1's rmse: 1.32241\n",
      "[600]\ttraining's rmse: 1.22354\tvalid_1's rmse: 1.22402\n",
      "[700]\ttraining's rmse: 1.13667\tvalid_1's rmse: 1.13662\n",
      "[800]\ttraining's rmse: 1.05978\tvalid_1's rmse: 1.05924\n",
      "[900]\ttraining's rmse: 0.991978\tvalid_1's rmse: 0.991012\n",
      "[1000]\ttraining's rmse: 0.93238\tvalid_1's rmse: 0.931014\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's rmse: 0.932014\tvalid_1's rmse: 0.936746\n",
      "fold 3\n",
      "[LightGBM] [Warning] min_data_in_leaf is set=10, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=10\n",
      "[100]\ttraining's rmse: 1.84549\tvalid_1's rmse: 1.84968\n",
      "[200]\ttraining's rmse: 1.69211\tvalid_1's rmse: 1.69604\n",
      "[300]\ttraining's rmse: 1.55438\tvalid_1's rmse: 1.55808\n",
      "[400]\ttraining's rmse: 1.43118\tvalid_1's rmse: 1.43465\n",
      "[500]\ttraining's rmse: 1.32123\tvalid_1's rmse: 1.3245\n",
      "[600]\ttraining's rmse: 1.22334\tvalid_1's rmse: 1.22641\n",
      "[700]\ttraining's rmse: 1.13645\tvalid_1's rmse: 1.1393\n",
      "[800]\ttraining's rmse: 1.05954\tvalid_1's rmse: 1.06221\n",
      "[900]\ttraining's rmse: 0.991743\tvalid_1's rmse: 0.994236\n",
      "[1000]\ttraining's rmse: 0.932152\tvalid_1's rmse: 0.934448\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's rmse: 0.932014\tvalid_1's rmse: 0.936746\n",
      "fold 4\n",
      "[LightGBM] [Warning] min_data_in_leaf is set=10, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=10\n",
      "[100]\ttraining's rmse: 1.84545\tvalid_1's rmse: 1.85021\n",
      "[200]\ttraining's rmse: 1.6921\tvalid_1's rmse: 1.69654\n",
      "[300]\ttraining's rmse: 1.55443\tvalid_1's rmse: 1.55869\n",
      "[400]\ttraining's rmse: 1.43127\tvalid_1's rmse: 1.43526\n",
      "[500]\ttraining's rmse: 1.32132\tvalid_1's rmse: 1.32498\n",
      "[600]\ttraining's rmse: 1.22343\tvalid_1's rmse: 1.22669\n",
      "[700]\ttraining's rmse: 1.13653\tvalid_1's rmse: 1.13942\n",
      "[800]\ttraining's rmse: 1.05961\tvalid_1's rmse: 1.06214\n",
      "[900]\ttraining's rmse: 0.991815\tvalid_1's rmse: 0.994003\n",
      "[1000]\ttraining's rmse: 0.932216\tvalid_1's rmse: 0.934089\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's rmse: 0.932014\tvalid_1's rmse: 0.936746\n",
      "fold 5\n",
      "[LightGBM] [Warning] min_data_in_leaf is set=10, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=10\n",
      "[100]\ttraining's rmse: 1.8454\tvalid_1's rmse: 1.84967\n",
      "[200]\ttraining's rmse: 1.69206\tvalid_1's rmse: 1.69494\n",
      "[300]\ttraining's rmse: 1.5544\tvalid_1's rmse: 1.55604\n",
      "[400]\ttraining's rmse: 1.43123\tvalid_1's rmse: 1.43183\n",
      "[500]\ttraining's rmse: 1.32131\tvalid_1's rmse: 1.32098\n",
      "[600]\ttraining's rmse: 1.22343\tvalid_1's rmse: 1.2224\n",
      "[700]\ttraining's rmse: 1.13654\tvalid_1's rmse: 1.13493\n",
      "[800]\ttraining's rmse: 1.05961\tvalid_1's rmse: 1.05753\n",
      "[900]\ttraining's rmse: 0.99177\tvalid_1's rmse: 0.989367\n",
      "[1000]\ttraining's rmse: 0.932142\tvalid_1's rmse: 0.929517\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's rmse: 0.932014\tvalid_1's rmse: 0.936746\n",
      "fold 6\n",
      "[LightGBM] [Warning] min_data_in_leaf is set=10, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=10\n",
      "[100]\ttraining's rmse: 1.84756\tvalid_1's rmse: 1.8298\n",
      "[200]\ttraining's rmse: 1.69393\tvalid_1's rmse: 1.67722\n",
      "[300]\ttraining's rmse: 1.556\tvalid_1's rmse: 1.54035\n",
      "[400]\ttraining's rmse: 1.43261\tvalid_1's rmse: 1.41802\n",
      "[500]\ttraining's rmse: 1.32244\tvalid_1's rmse: 1.30896\n",
      "[600]\ttraining's rmse: 1.22436\tvalid_1's rmse: 1.21191\n",
      "[700]\ttraining's rmse: 1.1373\tvalid_1's rmse: 1.12587\n",
      "[800]\ttraining's rmse: 1.06026\tvalid_1's rmse: 1.04984\n",
      "[900]\ttraining's rmse: 0.992348\tvalid_1's rmse: 0.982923\n",
      "[1000]\ttraining's rmse: 0.932664\tvalid_1's rmse: 0.92421\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's rmse: 0.932014\tvalid_1's rmse: 0.936746\n",
      "fold 7\n",
      "[LightGBM] [Warning] min_data_in_leaf is set=10, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=10\n",
      "[100]\ttraining's rmse: 1.84627\tvalid_1's rmse: 1.84369\n",
      "[200]\ttraining's rmse: 1.69273\tvalid_1's rmse: 1.69213\n",
      "[300]\ttraining's rmse: 1.55487\tvalid_1's rmse: 1.55592\n",
      "[400]\ttraining's rmse: 1.43152\tvalid_1's rmse: 1.43405\n",
      "[500]\ttraining's rmse: 1.32143\tvalid_1's rmse: 1.32544\n",
      "[600]\ttraining's rmse: 1.22339\tvalid_1's rmse: 1.22878\n",
      "[700]\ttraining's rmse: 1.13638\tvalid_1's rmse: 1.14304\n",
      "[800]\ttraining's rmse: 1.05939\tvalid_1's rmse: 1.06717\n",
      "[900]\ttraining's rmse: 0.991491\tvalid_1's rmse: 1.00026\n",
      "[1000]\ttraining's rmse: 0.931815\tvalid_1's rmse: 0.941478\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's rmse: 0.931815\tvalid_1's rmse: 0.941478\n",
      "fold 8\n",
      "[LightGBM] [Warning] min_data_in_leaf is set=10, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=10\n",
      "[100]\ttraining's rmse: 1.84456\tvalid_1's rmse: 1.85882\n",
      "[200]\ttraining's rmse: 1.69126\tvalid_1's rmse: 1.70503\n",
      "[300]\ttraining's rmse: 1.55364\tvalid_1's rmse: 1.56699\n",
      "[400]\ttraining's rmse: 1.43054\tvalid_1's rmse: 1.44348\n",
      "[500]\ttraining's rmse: 1.32067\tvalid_1's rmse: 1.33304\n",
      "[600]\ttraining's rmse: 1.22284\tvalid_1's rmse: 1.23462\n",
      "[700]\ttraining's rmse: 1.13603\tvalid_1's rmse: 1.14722\n",
      "[800]\ttraining's rmse: 1.05921\tvalid_1's rmse: 1.06981\n",
      "[900]\ttraining's rmse: 0.991468\tvalid_1's rmse: 1.00147\n",
      "[1000]\ttraining's rmse: 0.931918\tvalid_1's rmse: 0.941317\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's rmse: 0.931815\tvalid_1's rmse: 0.941478\n",
      "fold 9\n",
      "[LightGBM] [Warning] min_data_in_leaf is set=10, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=10\n",
      "[100]\ttraining's rmse: 1.84548\tvalid_1's rmse: 1.84961\n",
      "[200]\ttraining's rmse: 1.69216\tvalid_1's rmse: 1.69528\n",
      "[300]\ttraining's rmse: 1.55451\tvalid_1's rmse: 1.55658\n",
      "[400]\ttraining's rmse: 1.43134\tvalid_1's rmse: 1.43237\n",
      "[500]\ttraining's rmse: 1.32141\tvalid_1's rmse: 1.32154\n",
      "[600]\ttraining's rmse: 1.22355\tvalid_1's rmse: 1.22287\n",
      "[700]\ttraining's rmse: 1.13669\tvalid_1's rmse: 1.13534\n",
      "[800]\ttraining's rmse: 1.05983\tvalid_1's rmse: 1.05789\n",
      "[900]\ttraining's rmse: 0.992063\tvalid_1's rmse: 0.989611\n",
      "[1000]\ttraining's rmse: 0.932497\tvalid_1's rmse: 0.929604\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's rmse: 0.931815\tvalid_1's rmse: 0.941478\n"
     ]
    }
   ],
   "source": [
    "#导入所需库\n",
    "import os\n",
    "import math\n",
    "import scipy\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "\n",
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")\n",
    "import lightgbm as lgb\n",
    "# import catboost as cbt\n",
    "# import xgboost as xgb\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn import preprocessing\n",
    "from sklearn.model_selection import train_test_split, StratifiedKFold, cross_val_score\n",
    "from sklearn.preprocessing import MinMaxScaler, StandardScaler, LabelEncoder, OneHotEncoder\n",
    "from sklearn.metrics import roc_auc_score, auc, accuracy_score, log_loss, f1_score, precision_score, recall_score, accuracy_score\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from lightgbm import log_evaluation, early_stopping\n",
    "callbacks = [log_evaluation(period=100), early_stopping(stopping_rounds=30)]\n",
    "from scipy import stats\n",
    "# from tqdm._tqdm import trange\n",
    "\n",
    "#Loading Data\n",
    "path_data = '.'\n",
    "test_data = '.'\n",
    "\n",
    "df_train = pd.read_table(path_data + '/URQMD-SM-I-ba07-train.dat',sep='\\s+',header=None)\n",
    "df_test  = pd.read_table(test_data + '/URQMD-SM-I-ba07-test.dat',sep='\\s+',header=None)\n",
    "\n",
    "df_train['isTest'] = 1\n",
    "df_test['isTest']  = 0\n",
    "df_train.columns = ['Mch','npron','Nhhe','ETL','Erat','Nmeanpt','meanphhept','bim','isTest']\n",
    "df_test.columns = ['Mch','npron','Nhhe','ETL','Erat','Nmeanpt','meanphhept','bim','isTest']\n",
    "\n",
    "\n",
    "target= df_train['bim']\n",
    "test_target = df_test['bim']\n",
    "label = df_train['isTest']\n",
    "del df_train['bim']\n",
    "del df_train['isTest']\n",
    "\n",
    "feats = [feat for feat in df_train.columns if feat not in ['bim','isTrain']]\n",
    "print(f\"feats:{feats}\")\n",
    "\n",
    "\n",
    "#LightGBM parameter settings\n",
    "param = param = {'num_leaves': 10,\n",
    "         'min_data_in_leaf': 10, \n",
    "         'objective':'regression',\n",
    "         'max_depth': -1,\n",
    "         'learning_rate': 0.001,\n",
    "         \"min_child_samples\": 20,\n",
    "         \"boosting\": \"gbdt\",\n",
    "         \"feature_fraction\": 0.9,\n",
    "         \"bagging_freq\": 1,\n",
    "         \"bagging_fraction\": 0.9 ,\n",
    "         \"bagging_seed\": 11,\n",
    "         \"metric\": 'rmse',\n",
    "         \"lambda_l1\": 0.1,\n",
    "         \"verbosity\": -1,\n",
    "         \"nthread\": 4,\n",
    "         \"random_state\": 2019}\n",
    "folds = StratifiedKFold(n_splits=10, shuffle=True, random_state=2019)\n",
    "oof = np.zeros(len(df_train))\n",
    "predictions = np.zeros(len(df_test))\n",
    "feature_importance_df = pd.DataFrame()\n",
    "\n",
    "# Cross-Validation K-fold\n",
    "for fold_, (trn_idx, val_idx) in enumerate(folds.split(df_train,label.values)):\n",
    "    print(\"fold {}\".format(fold_))\n",
    "    trn_data = lgb.Dataset(df_train.iloc[trn_idx][df_train.columns], label=target.iloc[trn_idx])\n",
    "    val_data = lgb.Dataset(df_train.iloc[val_idx][df_train.columns], label=target.iloc[val_idx])#, categorical_feature=categorical_feats)\n",
    "\n",
    "    num_round = 1000\n",
    "    clf = lgb.train(param, trn_data, num_round, valid_sets = [trn_data, val_data], callbacks=callbacks,)\n",
    "    oof[val_idx] = clf.predict(df_train.iloc[val_idx][df_train.columns], num_iteration=clf.best_iteration)\n",
    "    \n",
    "    # feature importance\n",
    "    fold_importance_df = pd.DataFrame()\n",
    "    fold_importance_df[\"Feature\"] = list(df_train.columns)\n",
    "    fold_importance_df[\"importance\"] = clf.feature_importance(importance_type='gain')\n",
    "    fold_importance_df[\"fold\"] = fold_ + 1\n",
    "    feature_importance_df = pd.concat([feature_importance_df, fold_importance_df], axis=0)\n",
    "    \n",
    "    predictions += clf.predict(df_test[df_train.columns], num_iteration=clf.best_iteration) / folds.n_splits\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/lifupeng/anaconda3/envs/ML4NP/lib/python3.9/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n",
      "  if pd.api.types.is_categorical_dtype(vector):\n",
      "/Users/lifupeng/anaconda3/envs/ML4NP/lib/python3.9/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n",
      "  if pd.api.types.is_categorical_dtype(vector):\n",
      "/Users/lifupeng/anaconda3/envs/ML4NP/lib/python3.9/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n",
      "  if pd.api.types.is_categorical_dtype(vector):\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'LightGBM Features (avg over folds)')"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABCsAAAPvCAYAAADqFUR9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABdb0lEQVR4nO3deZgU5b347W8DM8MyzLCJgKCACm4gGIIiqCgqKO6JRlHZYqLHLS6oMW6gJ8EtUWJOXBFwiagRUHGJRsVdXFGjhCiCS4TgBqMQEZh6//Clf44zICAwj8x9X1dfl131dNXTTaXP6c9UV+eyLMsCAAAAIBG1qnsCAAAAAN8kVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAUOOMHTs2crlcvPjiiyscM3v27MjlcjF27Ng12kcul4sTTzzxO8c988wzMXz48Jg/f36V68vLy+OWW26Jvn37RvPmzaOgoCAaNWoUO+20U1x++eXx8ccfVxjftm3byOVy+VvdunVjiy22iNNOO63S2OHDh0cul4tatWrFO++8U2nfCxcujJKSksjlcjF48ODvfC7f3vc3b1988cV3Pn5N/PnPf17jf6NUzJ8/P5o1axbjx4+v7qlsEB555JHo1q1bNGjQIHK5XEyaNGmVHztlypTI5XIxZcqU7xw7ePDgaNu27WrPrbi4OP7973+v1uMAaiKxAgCq0LJly3j22Wejf//+63Q/zzzzTIwYMaLKWPHf//43+vXrFwMHDowmTZrEH//4x3jkkUfilltuiT322CMuu+yyOPjggys9rmfPnvHss8/Gs88+Gw888EAce+yxce2110a/fv2qnENxcXGMGTOm0vI777wzlixZEgUFBav8fL6572/e6tevv8rbWB0bQqwYMWJEtGrVKn72s59V91R+8LIsi8MOOywKCgrinnvuiWeffTZ222236p5WXp8+faJ79+7xm9/8prqnApC8OtU9AQBIUVFRUey0007VOodTTjklHn744fjLX/4SRxxxRIV1++23X5x77rlx6623Vnrc8jMvltt9993j888/j4suuij+9a9/RYcOHSqM/9nPfhbjxo2LESNGRK1a/+/vGKNHj46DDz447rnnnlWe87f3/UO1aNGidRZYvunTTz+Na6+9Nq644orI5XLrfH8bgpX923z44Yfx6aefxsEHHxx9+vRZzzNbNSeccEL87Gc/i//93/+NNm3aVPd0AJLlzAoAqMKKvgZy9913R+fOnaOoqCjat28fo0aNyn+doio333xzbL311lG/fv3YfvvtY/Lkyfl1w4cPjzPOOCMiItq1a5f/ysSUKVNizpw5ceONN0b//v0rhYrl6tevH7/4xS9W6fmUlpZGRFR5lsTQoUPj/fffj4cffji/7F//+lc89dRTMXTo0FXa/qqaO3duHHvssdG6desoLCyMdu3axYgRI2Lp0qUVxo0YMSJ23HHHaNKkSZSUlMQOO+wQo0ePjizL8mPatm0bb7zxRjz++OP51275afnLv+oze/bsCtut6jT/3r17x3bbbRdPPPFE7LzzzlG/fv388y4rK4thw4ZFu3btorCwMDbZZJM45ZRTYuHChRW2e+edd8aOO+4YpaWlUb9+/Wjfvv0qvXZjx46NpUuXVjqr4sUXX4zDDz882rZtG/Xq1Yu2bdvGEUccEe+++25+zKuvvhq5XC5Gjx5dabsPPPBA5HK5CqFpdY/db7vxxhtj++23j7p160aTJk3i4IMPjunTp+fXX3nllZHL5eLtt9+u9NizzjorCgsLK3wV6e9//3v06dMnSkpKon79+tGzZ8945JFHKjxu+fxefvnl+OlPfxqNGzeOzTffvMr5DR8+PFq3bp3f3zePh4iIp556Kvr06RMNGzaM+vXrx8477xz33XffKj33sWPHRseOHaOoqCi23nrruOmmm6ocd/XVV8f2228fxcXF0bBhw9hqq60qnUWx//77R3FxcVx//fWrtG+AmkqsAIBV9OCDD8YhhxwSTZs2jdtvvz0uvfTSuO2222LcuHFVjr/vvvviT3/6U1x44YVx11135T/gLb8+xDHHHBMnnXRSRERMmDAh/5WJHXbYIR577LFYunRpHHDAAas9zyzLYunSpbF06dL44osv4rHHHosrr7wyevbsGe3atas0fsstt4xddtklbrzxxvyyG2+8Mdq2bbvaf53+5r6X38rLyyPi61DRvXv3+Nvf/hbnn39+PPDAA/Hzn/88Ro4cWSm6zJ49O4499ti44447YsKECXHIIYfESSedFBdddFF+zMSJE6N9+/bRtWvX/Gs3ceLE1ZrvcnPmzImjjjoqBgwYEPfff38cf/zxsWjRothtt91i3LhxcfLJJ8cDDzwQZ511VowdOzYOOOCAfDh59tln42c/+1m0b98+xo8fH/fdd1+cf/75lQJMVe67777o2rVrNGrUqNLz79ixY1x55ZXxt7/9LS655JKYM2dO/PjHP85/4N9+++2ja9euVX6FZ+zYsdG8efPYd999I2L1j91vGzlyZPz85z+PbbfdNiZMmBCjRo2K1157LXr06BFvvfVWREQcddRRUVhYWCnwLVu2LG655ZbYf//9o1mzZhERccstt8Tee+8dJSUlMW7cuLjjjjuiSZMm0bdv30rBIiLikEMOiS222CLuvPPOuOaaa6qc4zHHHBMTJkyIiIiTTjqpwvHw+OOPxx577BELFiyI0aNHx2233RYNGzaM/fffP26//faVPvexY8fGkCFDYuutt4677rorzj333Ljooovi0UcfrTBu/Pjxcfzxx8duu+0WEydOjEmTJsWpp55aKWwVFhauVigBqLEyAKhhxowZk0VE9sILL6xwzKxZs7KIyMaMGZNf9uMf/zhr06ZNtnjx4vyyzz//PGvatGn27f+TGhHZxhtvnJWVleWXzZ07N6tVq1Y2cuTI/LLLLrssi4hs1qxZFR5/8cUXZxGRPfjgg5XmtmTJkgq3b9pss82yiKh06969ezZnzpwKYy+44IIsIrKPPvooGzNmTFZUVJR98skn2dKlS7OWLVtmw4cPz7Isyxo0aJANGjRoha/Vd+37nHPOybIsy4499tisuLg4e/fddys87vLLL88iInvjjTeq3O6yZcuyJUuWZBdeeGHWtGnTrLy8PL9u2223zXbbbbdKj1n+b/zt1/Wxxx7LIiJ77LHH8st22223LCKyRx55pMLYkSNHZrVq1ap0nPz1r3/NIiK7//77K8x//vz5K319qlK/fv3suOOO+85xS5cuzb744ousQYMG2ahRo/LL//jHP2YRkc2YMSO/7NNPP82Kioqy008/Pb9sdY7db/vss8+yevXqZfvuu2+F5e+9915WVFSUDRgwIL/skEMOyVq3bp0tW7Ysv+z+++/PIiK79957syzLsoULF2ZNmjTJ9t9//wrbW7ZsWbb99ttn3bt3zy9bfoyef/75K53jcsv/d3vZZZdVWL7TTjtlzZs3zz7//PP8sqVLl2bbbbdd1rp16/wx9e3jY9myZVmrVq2yHXbYocJxN3v27KygoCDbbLPN8stOPPHErFGjRqs0z3POOSerVatW9sUXX6zSeICayJkVALAKFi5cGC+++GIcdNBBUVhYmF9eXFwc+++/f5WP2X333aNhw4b5+xtvvHE0b968wqn8q2vatGlRUFBQ4fbtX/no1atXvPDCC/HCCy/E008/HaNHj46PPvoo9thjj0pjlzv00EOjsLAwbr311rj//vtj7ty5q/QLIN/2zX0vvx1//PERETF58uTYfffdo1WrVhXOvNhnn30i4uu/fi/36KOPxp577hmlpaVRu3btKCgoiPPPPz8++eSTmDdv3mrP67s0btw49thjjwrLJk+eHNttt1106dKlwnz79u1b4askP/7xjyMi4rDDDos77rhjlX/pYf78+bFo0aJo3rx5pXVffPFFnHXWWbHFFltEnTp1ok6dOlFcXBwLFy6s8NWLI488MoqKiiqczXDbbbfF4sWLY8iQIRGxZsfuNz377LPx3//+t9Lx0KZNm9hjjz0qnAkxZMiQ+OCDD+Lvf/97ftmYMWOiRYsW+X/nZ555Jj799NMYNGhQpTNw+vXrFy+88EKlsxF+8pOffOc8V2ThwoUxderU+OlPfxrFxcX55bVr146jjz46Pvjgg5gxY0aVj50xY0Z8+OGHMWDAgApfl9lss81i5513rjC2e/fuMX/+/DjiiCPi7rvvXuH/1iIimjdvHuXl5TF37tw1fl4AGzqxAgBWwWeffRZZlsXGG29caV1VyyIimjZtWmlZUVFR/Pe///3O/W266aYREZXCRseOHfMRYEXXqygtLY1u3bpFt27dYuedd46hQ4fGX/7yl5g+fXr8/ve/r/IxDRo0iJ/97Gdx4403xujRo2PPPfeMzTbb7DvnubJ9L7+1atUqIiL+85//xL333lsptmy77bYREfkPd88//3zsvffeERFx/fXXx9NPPx0vvPBCnHPOORERq/T6ra6WLVtWWvaf//wnXnvttUrzbdiwYWRZlp/vrrvuGpMmTYqlS5fGwIEDo3Xr1rHddtvFbbfdttJ9Ln8edevWrbRuwIAB8ac//SmOOeaY+Nvf/hbPP/98vPDCC7HRRhtVeP5NmjSJAw44IG666aZYtmxZRHz9tYXu3bvnX9c1OXa/6ZNPPlnha9SqVav8+oiIffbZJ1q2bJn/aspnn30W99xzTwwcODBq164dEV+/rhERP/3pTyu9tpdccklkWRaffvpphf1Ute9Vtfz5r2j+33yO37Z8eYsWLSqt+/ayo48+Om688cZ499134yc/+Uk0b948dtxxxwrXgllu+b/5ujiWATYUfg0EAFZB48aNI5fL5T9ofdO6+Oto7969o06dOnHPPffEL3/5y/zyevXqRbdu3SIiKlys87t07tw5Ir6+KOOKDB06NG644YZ47bXXqvyVke+rWbNm0blz5/jtb39b5frlHxzHjx8fBQUFMXny5Aof5CdNmrTK+1r+uMWLF1dYvqK/dld1kclmzZpFvXr1KlzL49vrlzvwwAPjwAMPjMWLF8dzzz0XI0eOjAEDBkTbtm2jR48eVT5+ecz69gfzBQsWxOTJk+OCCy6IX//61/nlixcvrjQ24uuzGe688854+OGHY9NNN40XXnghrr766vz673vsLp/nnDlzKq378MMPK7wOy89W+OMf/xjz58+Pv/zlLxXO8oj4f6/bVVddtcJfjvl2RPk+v5TSuHHjqFWr1grn/805fdvy517V61TVsiFDhsSQIUNi4cKF8cQTT8QFF1wQ++23X/zrX/+qEP+W/zuuaL8AOLMCAFZJgwYNolu3bjFp0qT46quv8su/+OKL1YoG31ZUVBQRlf/C2rJlyxg6dGjcd999MX78+DXe/nLTpk2LiKjyKwfL9ejRI4YOHRoHH3xwHHzwwd97n9+23377xT/+8Y/YfPPNK5198c0zMHK5XNSpUyf/l/iIr1+fm2++udI2V3SmyvJfgXjttdcqLF+dn2Hdb7/9YubMmdG0adMq5/vNX5r45nx22223uOSSSyIi4pVXXlnh9gsLC6N9+/Yxc+bMCstzuVxkWZY/Npa74YYb8mdPfNPee+8dm2yySYwZMybGjBkTdevWrfALMt/32O3Ro0fUq1cvbrnllgrLP/jgg3j00UcrXYR1yJAh8eWXX8Ztt90WY8eOjR49esRWW22VX9+zZ89o1KhRvPnmm1W+rt26davwdZXvq0GDBrHjjjvGhAkTKhwr5eXlccstt0Tr1q0r/Zzvch07doyWLVvGbbfdVuGXaN5999145plnVrrPffbZJ84555z46quv4o033qiw/p133ommTZuu0pktADWVMysAqLEeffTRSj9tGRH5X1D4tgsvvDD69+8fffv2jV/96lexbNmyuOyyy6K4uLjKv3ivik6dOkVExKhRo2LQoEFRUFAQHTt2jIYNG8aVV14Zs2bNiiOPPDLuueeeOPDAA6NVq1axaNGi+Oc//xnjx4+PunXrVvo50vnz58dzzz0XERFLliyJ6dOnx+9+97soKiqKE044YaXzqepnMNeWCy+8MB5++OHYeeed4+STT46OHTvGl19+GbNnz477778/rrnmmmjdunX0798//vCHP8SAAQPil7/8ZXzyySdx+eWXV/rwHvH16zd+/Pi4/fbbo3379lG3bt3o1KlT/PjHP46OHTvGsGHDYunSpdG4ceOYOHFiPPXUU6s831NOOSXuuuuu2HXXXePUU0+Nzp07R3l5ebz33nvx0EMPxemnnx477rhjnH/++fHBBx9Enz59onXr1jF//vwYNWpUFBQUxG677bbSffTu3TseeOCBCstKSkpi1113jcsuuyyaNWsWbdu2jccffzxGjx5d6VdDIr4+m2HgwIHxhz/8IUpKSuKQQw7J/1TtN1/7NT12GzVqFOedd1785je/iYEDB8YRRxwRn3zySYwYMSLq1q0bF1xwQYXxW221VfTo0SNGjhwZ77//flx33XUV1hcXF8dVV10VgwYNik8//TR++tOfRvPmzeOjjz6KV199NT766KMKZ4asDSNHjoy99tordt999xg2bFgUFhbGn//85/jHP/4Rt9122wrP3KhVq1ZcdNFFccwxx8TBBx8cv/jFL2L+/PkxfPjwSl8D+cUvfhH16tWLnj17RsuWLWPu3LkxcuTIKC0tzV/XZLnnnnsudtttt+91xgjABq8aL+4JANVi+S9FrOg2a9asKn8NJMuybOLEiVmnTp2ywsLCbNNNN80uvvji7OSTT84aN25cYVxEZCeccEKlfW+22WaVflnj7LPPzlq1apXVqlWr0i9VLFu2LLvpppuyvfbaK2vWrFlWp06drLS0NOvevXt23nnnZR988EGl7X/zudSuXTvbdNNNs5/+9KfZK6+8UmHsN38NZGVW59dA+vfvv9IxH330UXbyySdn7dq1ywoKCrImTZpkP/rRj7Jzzjmnwi8j3HjjjVnHjh2zoqKirH379tnIkSOz0aNHV/qFj9mzZ2d777131rBhwywiKvw6w7/+9a9s7733zkpKSrKNNtooO+mkk7L77ruvyl8D2Xbbbauc7xdffJGde+65WceOHbPCwsKstLQ069SpU3bqqadmc+fOzbIsyyZPnpzts88+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AABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJqVPdE6D6PfG/R0RJSUl1TwMAAAAiwpkVAAAAQGLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLqVPcEqH7vX7xTNKxbu7qnAQAAQBU2Pf/16p7CeufMCgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVP0CzZ8+OXC4X06ZNq+6pAAAAwFonVqxHgwcPjlwuF8cdd1yldccff3zkcrkYPHjw+p8YAAAAJESsWM/atGkT48ePj//+97/5ZV9++WXcdtttsemmm1bjzAAAACANdap7AjXNDjvsEO+8805MmDAhjjzyyIiImDBhQrRp0ybat2+fH1deXh6XXXZZXH/99fH+++/HxhtvHMcee2ycc845+THvvPNOnHrqqTF16tTYcsst45prrokePXqs9+cEAADA6vvdK43i08W1v3NcnQEDvnPMRhttFKNGjVob00qCWFENhgwZEmPGjMnHihtvvDGGDh0aU6ZMyY85++yz4/rrr48rrrgievXqFXPmzIl//vOfFbZzzjnnxOWXXx5bbrllnHPOOXHEEUfE22+/HXXqVP3Punjx4li8eHH+fllZ2dp/cgAAAKySTxfXjk9WIVbEf/6z7ieTGF8DqQZHH310PPXUUzF79ux499134+mnn46jjjoqv/7zzz+PUaNGxaWXXhqDBg2KzTffPHr16hXHHHNMhe0MGzYs+vfvHx06dIgRI0bEu+++G2+//fYK9zty5MgoLS3N39q0abPOniMAAACsKWdWVINmzZpF//79Y9y4cZFlWfTv3z+aNWuWXz99+vRYvHhx9OnTZ6Xb6dy5c/6/W7ZsGRER8+bNi6222qrK8WeffXacdtpp+ftlZWWCBQAAQDVpUrRslcbVadTqO8dstNFG33c6SRErqsnQoUPjxBNPjIiI//u//6uwrl69equ0jYKCgvx/53K5iPj6WhcrUlRUFEVFRas7VQAAANaB33Sdv0rjNj1/yjqdR4p8DaSa9OvXL7766qv46quvom/fvhXWbbnlllGvXr145JFHqml2AAAAUH2cWVFNateuHdOnT8//9zfVrVs3zjrrrDjzzDOjsLAwevbsGR999FG88cYb8fOf/7w6pgsAAADrjVhRjUpKSla47rzzzos6derE+eefHx9++GG0bNkyjjvuuPU4OwAAAKgeuSzLsuqeBNWjrKwsSktL4x9nbx0N667Cz+UAAACw3m16/uvVPYW1Zvnn0AULFqz0D/iuWQEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKXWqewJUvza/fi5KSkqqexoAAAAQEc6sAAAAABIjVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVhB7XbNX9LyqZ3VPAwAAACJCrAAAAAASI1YAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYsYaGDx8eXbp0WemY3r17xymnnLJe5gMAAAAbCrFiAzB48OA46KCDqnsaAAAAsFaIFQAAAEBSqjVW9O7dO0466aQ45ZRTonHjxrHxxhvHddddFwsXLowhQ4ZEw4YNY/PNN48HHngg/5g333wz9t133yguLo6NN944jj766Pj444/z6x988MHo1atXNGrUKJo2bRr77bdfzJw5M79+9uzZkcvlYsKECbH77rtH/fr1Y/vtt49nn302P2bs2LHRqFGjmDRpUnTo0CHq1q0be+21V7z//vuVnsPNN98cbdu2jdLS0jj88MPj888/r7C+vLw8zjzzzGjSpEm0aNEihg8fXmH9ggUL4pe//GU0b948SkpKYo899ohXX301v375102uvfbaaNOmTdSvXz8OPfTQmD9/fn79uHHj4u67745cLhe5XC6mTJmyJv8cAAAAkIRqP7Ni3Lhx0axZs3j++efjpJNOiv/5n/+JQw89NHbeeed4+eWXo2/fvnH00UfHokWLYs6cObHbbrtFly5d4sUXX4wHH3ww/vOf/8Rhhx2W397ChQvjtNNOixdeeCEeeeSRqFWrVhx88MFRXl5eYb/nnHNODBs2LKZNmxYdOnSII444IpYuXZpfv2jRovjtb38b48aNi6effjrKysri8MMPr7CNmTNnxqRJk2Ly5MkxefLkePzxx+Piiy+u9PwaNGgQU6dOjUsvvTQuvPDCePjhhyMiIsuy6N+/f8ydOzfuv//+eOmll2KHHXaIPn36xKeffprfxttvvx133HFH3HvvvfHggw/GtGnT4oQTToiIiGHDhsVhhx0W/fr1izlz5sScOXNi5513rvK1Xrx4cZSVlVW4AQAAQHKyarTbbrtlvXr1yt9funRp1qBBg+zoo4/OL5szZ04WEdmzzz6bnXfeednee+9dYRvvv/9+FhHZjBkzqtzHvHnzsojIXn/99SzLsmzWrFlZRGQ33HBDfswbb7yRRUQ2ffr0LMuybMyYMVlEZM8991x+zPTp07OIyKZOnZplWZZdcMEFWf369bOysrL8mDPOOCPbcccdV/j8sizLfvzjH2dnnXVWlmVZ9sgjj2QlJSXZl19+WWHM5ptvnl177bX5/dSuXTt7//338+sfeOCBrFatWtmcOXOyLMuyQYMGZQceeGCVz/+bLrjggiwiKt26X9I92/mPO3/n4wEAAOD7WLBgQRYR2YIFC1Y6rtrPrOjcuXP+v2vXrh1NmzaNTp065ZdtvPHGERExb968eOmll+Kxxx6L4uLi/G2rrbaKiMh/1WPmzJkxYMCAaN++fZSUlES7du0iIuK9995b4X5btmyZ38dyderUiW7duuXvb7XVVtGoUaOYPn16flnbtm2jYcOGFbbzzW18ez/fHvPSSy/FF198EU2bNq3wnGbNmlXhqyubbrpptG7dOn+/R48eUV5eHjNmzPj2y7lSZ599dixYsCB/q+prLQAAAFDd6lT3BAoKCircz+VyFZblcrmI+PraD+Xl5bH//vvHJZdcUmk7y4PD/vvvH23atInrr78+WrVqFeXl5bHddtvFV199tcL9fnMf357Lt31zWVVz//Y2VjamvLw8WrZsWeU1Jho1alRp2bfnUNX8VqaoqCiKiopW6zEAAACwvlV7rFgdO+ywQ9x1113Rtm3bqFOn8tQ/+eSTmD59elx77bWxyy67RETEU089tUb7Wrp0abz44ovRvXv3iIiYMWNGzJ8/P38mx9qwww47xNy5c6NOnTrRtm3bFY5777334sMPP4xWrVpFRMSzzz4btWrVig4dOkRERGFhYSxbtmytzQsAAACqU7V/DWR1nHDCCfHpp5/GEUccEc8//3y888478dBDD8XQoUNj2bJl0bhx42jatGlcd9118fbbb8ejjz4ap5122hrtq6CgIE466aSYOnVqvPzyyzFkyJDYaaed8vFibdhzzz2jR48ecdBBB8Xf/va3mD17djzzzDNx7rnnxosvvpgfV7du3Rg0aFC8+uqr8eSTT8bJJ58chx12WLRo0SIivv46ymuvvRYzZsyIjz/+OJYsWbLW5ggAAADr2w8qVrRq1SqefvrpWLZsWfTt2ze22267+NWvfhWlpaVRq1atqFWrVowfPz5eeuml2G677eLUU0+Nyy67bI32Vb9+/TjrrLNiwIAB0aNHj6hXr16MHz9+rT6fXC4X999/f+y6664xdOjQ6NChQxx++OExe/bs/LU6IiK22GKLOOSQQ2LfffeNvffeO7bbbrv485//nF//i1/8Ijp27BjdunWLjTbaKJ5++um1Ok8AAABYn3JZlmXVPYnUjB07Nk455ZSYP39+dU8lhg8fHpMmTYpp06at9W2XlZVFaWlpdL+ke9SpVyeePknkAAAAYN1Z/jl0wYIFUVJSssJxP6gzKwAAAIANn1gBAAAAJMXXQGowXwMBAABgffI1EAAAAOAHSawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASalT3ROg+j183MNRUlJS3dMAAACAiHBmBQAAAJAYsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApaxwrbr755ujZs2e0atUq3n333YiIuPLKK+Puu+9ea5MDAAAAap41ihVXX311nHbaabHvvvvG/PnzY9myZRER0ahRo7jyyivX5vwAAACAGmaNYsVVV10V119/fZxzzjlRu3bt/PJu3brF66+/vtYmBwAAANQ8axQrZs2aFV27dq20vKioKBYuXPi9JwUAAADUXGsUK9q1axfTpk2rtPyBBx6IbbbZ5vvOCQAAAKjB6qzJg84444w44YQT4ssvv4wsy+L555+P2267LUaOHBk33HDD2p4jAAAAUIOsUawYMmRILF26NM4888xYtGhRDBgwIDbZZJMYNWpUHH744Wt7jgAAAEANstqxYunSpXHrrbfG/vvvH7/4xS/i448/jvLy8mjevPm6mB8AAABQw6z2NSvq1KkT//M//xOLFy+OiIhmzZoJFQAAAMBas0YX2Nxxxx3jlVdeWdtzAQAAAFiza1Ycf/zxcfrpp8cHH3wQP/rRj6JBgwYV1nfu3HmtTA4AAACoeXJZlmWr+6BatSqfkJHL5SLLssjlcrFs2bK1MjnWrbKysigtLY0FCxZESUlJdU8HAACADdyqfg5dozMrZs2atcYTAwAAAFiZNYoVm2222dqeBwAAAEBErGGsuOmmm1a6fuDAgWs0GQAAAIA1umZF48aNK9xfsmRJLFq0KAoLC6N+/frx6aefrrUJsu64ZgUAAADr06p+Dl2jny797LPPKty++OKLmDFjRvTq1Stuu+22NZ40AAAAwBrFiqpsueWWcfHFF8evfvWrtbVJAAAAoAZaa7EiIqJ27drx4Ycfrs1NAgAAADXMGl1g85577qlwP8uymDNnTvzpT3+Knj17rpWJ1VRLliyJgoKC6p4GAAAAVJs1OrPioIMOqnA75JBDYvjw4dG5c+e48cYb1/Yck9W7d+84+eST48wzz4wmTZpEixYtYvjw4fn1uVwurr766thnn32iXr160a5du7jzzjvz62fPnh25XC7uuOOO6N27d9StWzduueWWKC8vjwsvvDBat24dRUVF0aVLl3jwwQcrPW7ChAmx++67R/369WP77bePZ599dn0+fQAAAFgn1ihWlJeXV7gtW7Ys5s6dG3/5y1+iZcuWa3uOSRs3blw0aNAgpk6dGpdeemlceOGF8fDDD+fXn3feefGTn/wkXn311TjqqKPiiCOOiOnTp1fYxllnnRUnn3xyTJ8+Pfr27RujRo2K3//+93H55ZfHa6+9Fn379o0DDjgg3nrrrQqPO+ecc2LYsGExbdq06NChQxxxxBGxdOnSFc518eLFUVZWVuEGAAAAqVmjWHHhhRfGokWLKi3/73//GxdeeOH3ntQPSefOneOCCy6ILbfcMgYOHBjdunWLRx55JL/+0EMPjWOOOSY6dOgQF110UXTr1i2uuuqqCts45ZRT4pBDDol27dpFq1at4vLLL4+zzjorDj/88OjYsWNccskl0aVLl7jyyisrPG7YsGHRv3//6NChQ4wYMSLefffdePvtt1c415EjR0ZpaWn+1qZNm7X6WgAAAMDasEaxYsSIEfHFF19UWr5o0aIYMWLE957UD0nnzp0r3G/ZsmXMmzcvf79Hjx4V1vfo0aPSmRXdunXL/3dZWVl8+OGHla790bNnz0qP++a+l5/R8s19f9vZZ58dCxYsyN/ef//9lT01AAAAqBZrdIHNLMsil8tVWv7qq69GkyZNvvekfki+fTHMXC4X5eXlK33Mt1+7Bg0afOeYql7zb+57+bqV7buoqCiKiopWOjcAAACobqt1ZkXjxo2jSZMmkcvlokOHDtGkSZP8rbS0NPbaa6847LDD1tVcf5Cee+65Sve32mqrFY4vKSmJVq1axVNPPVVh+TPPPBNbb731OpkjAAAApGS1zqy48sorI8uyGDp0aIwYMSJKS0vz6woLC6Nt27aVvvZQ0915553RrVu36NWrV9x6663x/PPPx+jRo1f6mDPOOCMuuOCC2HzzzaNLly4xZsyYmDZtWtx6663radYAAABQfVYrVgwaNCgiItq1axc777xzpa9AUNmIESNi/Pjxcfzxx0eLFi3i1ltvjW222Waljzn55JOjrKwsTj/99Jg3b15ss802cc8998SWW265nmYNAAAA1SeXZVn2fTbw3//+N5YsWVJhWUlJyfea1IYil8vFxIkT46CDDqruqVSprKwsSktLY8GCBf7NAAAAWOdW9XPoGv0ayKJFi+LEE0+M5s2bR3FxcTRu3LjCDQAAAGBNrVGsOOOMM+LRRx+NP//5z1FUVBQ33HBDjBgxIlq1ahU33XTT2p4jAAAAUIOs0U+X3nvvvXHTTTdF7969Y+jQobHLLrvEFltsEZtttlnceuutceSRR67tef4gfc9v2AAAAECNtEZnVnz66afRrl27iPj6+hSffvppRET06tUrnnjiibU3OwAAAKDGWaNY0b59+5g9e3ZERGyzzTZxxx13RMTXZ1w0atRobc0NAAAAqIHWKFYMGTIkXn311YiIOPvss/PXrjj11FPjjDPOWKsTBAAAAGqW7/3TpRER7733Xrz44oux+eabx/bbb7825sV64KdLAQAAWJ9W9XPoGl1g85u+/PLL2HTTTWPTTTf9vpsCAAAAWLOvgSxbtiwuuuii2GSTTaK4uDjeeeediIg477zzYvTo0Wt1ggAAAEDNskax4re//W2MHTs2Lr300igsLMwv79SpU9xwww1rbXIAAABAzbNGseKmm26K6667Lo488sioXbt2fnnnzp3jn//851qbHAAAAFDzrFGs+Pe//x1bbLFFpeXl5eWxZMmS7z0pAAAAoOZao1ix7bbbxpNPPllp+Z133hldu3b93pMCAAAAaq41+jWQCy64II4++uj497//HeXl5TFhwoSYMWNG3HTTTTF58uS1PUcAAACgBlmtMyveeeedyLIs9t9//7j99tvj/vvvj1wuF+eff35Mnz497r333thrr73W1VwBAACAGmC1zqzYcsstY86cOdG8efPo27dv3HjjjfH2229HixYt1tX8AAAAgBpmtc6syLKswv0HHnggFi1atFYnBAAAANRsa3SBzeW+HS8AAAAAvq/VihW5XC5yuVylZQAAAABry2pdsyLLshg8eHAUFRVFRMSXX34Zxx13XDRo0KDCuAkTJqy9GQIAAAA1ymrFikGDBlW4f9RRR63VyQAAAACsVqwYM2bMupoHAAAAQER8zwtsAgAAAKxtYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYsR4NHjw4crlcpVu/fv2+93YPOuigtTNJAAAAqGZ1qnsCNU2/fv1izJgxFZYVFRVVOXbJkiVRUFCwPqYFAAAAyXBmxXpWVFQULVq0qHBr3LhxRETkcrm45ppr4sADD4wGDRrE//7v/8ayZcvi5z//ebRr1y7q1asXHTt2jFGjRuW3N3z48Bg3blzcfffd+TM1pkyZUk3PDgAAAL4/Z1Yk5oILLoiRI0fGFVdcEbVr147y8vJo3bp13HHHHdGsWbN45pln4pe//GW0bNkyDjvssBg2bFhMnz49ysrK8mdsNGnSpMptL168OBYvXpy/X1ZWtl6eEwAAAKwOsWI9mzx5chQXF1dYdtZZZ8V5550XEREDBgyIoUOHVlg/YsSI/H+3a9cunnnmmbjjjjvisMMOi+Li4qhXr14sXrw4WrRosdJ9jxw5ssK2AAAAIEVixXq2++67x9VXX11h2TfPhOjWrVulx1xzzTVxww03xLvvvhv//e9/46uvvoouXbqs9r7PPvvsOO200/L3y8rKok2bNqu9HQAAAFiXxIr1rEGDBrHFFlusdP033XHHHXHqqafG73//++jRo0c0bNgwLrvsspg6depq77uoqGiFF/MEAACAVIgViXvyySdj5513juOPPz6/bObMmRXGFBYWxrJly9b31AAAAGCd8Gsg69nixYtj7ty5FW4ff/zxCsdvscUW8eKLL8bf/va3+Ne//hXnnXdevPDCCxXGtG3bNl577bWYMWNGfPzxx7FkyZJ1/TQAAABgnREr1rMHH3wwWrZsWeHWq1evFY4/7rjj4pBDDomf/exnseOOO8Ynn3xS4SyLiIhf/OIX0bFjx+jWrVtstNFG8fTTT6/rpwEAAADrTC7Lsqy6J0H1KCsri9LS0liwYEGUlJRU93QAAADYwK3q51BnVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJ2aBjxeDBgyOXy8XFF19cYfmkSZMil8tV06zWrtmzZ0cul4tp06ZV91QAAABgrdigY0VERN26deOSSy6Jzz77rLqnAgAAAKyCDT5W7LnnntGiRYsYOXJklevHjh0bjRo1ismTJ0fHjh2jfv368dOf/jQWLlwY48aNi7Zt20bjxo3jpJNOimXLluUf99VXX8WZZ54Zm2yySTRo0CB23HHHmDJlSn79J598EkcccUS0bt066tevH506dYrbbrutwr579+4dJ598cpx55pnRpEmTaNGiRQwfPrzCmFwuF1dffXXss88+Ua9evWjXrl3ceeed+fXt2rWLiIiuXbtGLpeL3r17f78XDAAAAKrZBh8rateuHb/73e/iqquuig8++KDKMYsWLYo//vGPMX78+HjwwQdjypQpccghh8T9998f999/f9x8881x3XXXxV//+tf8Y4YMGRJPP/10jB8/Pl577bU49NBDo1+/fvHWW29FRMSXX34ZP/rRj2Ly5Mnxj3/8I375y1/G0UcfHVOnTq2w73HjxkWDBg1i6tSpcemll8aFF14YDz/8cIUx5513XvzkJz+JV199NY466qg44ogjYvr06RER8fzzz0dExN///veYM2dOTJgwYYWvxeLFi6OsrKzCDQAAAFKTy7Isq+5JrCuDBw+O+fPnx6RJk6JHjx6xzTbbxOjRo2PSpElx8MEHR5ZlMXbs2BgyZEi8/fbbsfnmm0dExHHHHRc333xz/Oc//4ni4uKIiOjXr1+0bds2rrnmmpg5c2ZsueWW8cEHH0SrVq3y+9tzzz2je/fu8bvf/a7K+fTv3z+23nrruPzyyyPi6zMrli1bFk8++WR+TPfu3WOPPfbIX2cjl8vFcccdF1dffXV+zE477RQ77LBD/PnPf47Zs2dHu3bt4pVXXokuXbqs9PUYPnx4jBgxotLyBQsWRElJySq8ogAAALDmysrKorS09Ds/h9ZZj3OqVpdccknssccecfrpp1daV79+/XyoiIjYeOONo23btvlQsXzZvHnzIiLi5ZdfjizLokOHDhW2s3jx4mjatGlERCxbtiwuvvjiuP322+Pf//53LF68OBYvXhwNGjSo8JjOnTtXuN+yZcv8fpbr0aNHpftrckHNs88+O0477bT8/bKysmjTps1qbwcAAADWpRoTK3bdddfo27dv/OY3v4nBgwdXWFdQUFDhfi6Xq3JZeXl5RESUl5dH7dq146WXXoratWtXGLc8cPz+97+PK664Iq688sro1KlTNGjQIE455ZT46quvvnPfy/ezMmvyayZFRUVRVFS02o8DAACA9anGxIqIiIsvvji6dOlS6YyI1dW1a9dYtmxZzJs3L3bZZZcqxzz55JNx4IEHxlFHHRURXweOt956K7beeuvV3t9zzz0XAwcOrHC/a9euERFRWFgYEVHh4p8AAADwQ1ajYkWnTp3iyCOPjKuuuup7badDhw5x5JFHxsCBA+P3v/99dO3aNT7++ON49NFHo1OnTrHvvvvGFltsEXfddVc888wz0bhx4/jDH/4Qc+fOXaNYceedd0a3bt2iV69eceutt8bzzz8fo0ePjoiI5s2bR7169eLBBx+M1q1bR926daO0tPR7PT8AAACoThv8r4F820UXXRRr45qiY8aMiYEDB8bpp58eHTt2jAMOOCCmTp2avwbEeeedFzvssEP07ds3evfuHS1atIiDDjpojfY1YsSIGD9+fHTu3DnGjRsXt956a2yzzTYREVGnTp344x//GNdee220atUqDjzwwO/93AAAAKA6bdC/BrIhyOVyMXHixDUOHSuzqldhBQAAgLVhVT+H1rgzKwAAAIC0iRUAAABAUmrUBTZ/iHxLBwAAgJrGmRUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRaxYz8aOHRuNGjVa6ZjBgwfHQQcdtF7mAwAAAKkRK9aiwYMHRy6Xi4svvrjC8kmTJkUul6umWQEAAMAPi1ixltWtWzcuueSS+Oyzz6p7KgAAAPCDJFasZXvuuWe0aNEiRo4cudJxf/vb32LrrbeO4uLi6NevX8yZM6fSmMsvvzxatmwZTZs2jRNOOCGWLFmSX/fVV1/FmWeeGZtsskk0aNAgdtxxx5gyZcrafjoAAACw3okVa1nt2rXjd7/7XVx11VXxwQcfVDlm0aJFcfnll8fNN98cTzzxRLz33nsxbNiwCmMee+yxmDlzZjz22GMxbty4GDt2bIwdOza/fsiQIfH000/H+PHj47XXXotDDz00+vXrF2+99dYK57Z48eIoKyurcAMAAIDUiBXrwMEHHxxdunSJCy64oMr1S5YsiWuuuSa6desWO+ywQ5x44onxyCOPVBjTuHHj+NOf/hRbbbVV7LffftG/f//8mJkzZ8Ztt90Wd955Z+yyyy6x+eabx7Bhw6JXr14xZsyYFc5r5MiRUVpamr+1adNm7T1pAAAAWEvEinXkkksuiXHjxsWbb75ZaV39+vVj8803z99v2bJlzJs3r8KYbbfdNmrXrl3lmJdffjmyLIsOHTpEcXFx/vb444/HzJkzVzins88+OxYsWJC/vf/++9/3aQIAAMBaV6e6J7Ch2nXXXaNv377xm9/8JgYPHlxhXUFBQYX7uVwusiz7zjHl5eUREVFeXh61a9eOl156qULQiIgoLi5e4ZyKioqiqKhodZ8KAAAArFdixTp08cUXR5cuXaJDhw5rdbtdu3aNZcuWxbx582KXXXZZq9sGAACA6uZrIOtQp06d4sgjj4yrrrpqrW63Q4cOceSRR8bAgQNjwoQJMWvWrHjhhRfikksuifvvv3+t7gsAAADWN7FiHbvooosqfcVjbRgzZkwMHDgwTj/99OjYsWMccMABMXXqVBfNBAAA4Acvl62LT9L8IJSVlUVpaWksWLAgSkpKqns6AAAAbOBW9XOoMysAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkBSxAgAAAEiKWAEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWsAAAAAJIiVgAAAABJESsAAACApIgVAAAAQFLECgAAACApYgUAAACQFLECAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBS6lT3BKg+WZZFRERZWVk1zwQAAICaYPnnz+WfR1dErKjBPvnkk4iIaNOmTTXPBAAAgJrk888/j9LS0hWuFytqsCZNmkRExHvvvbfSg4Sap6ysLNq0aRPvv/9+lJSUVPd0SIzjgxVxbLAyjg9WxLHByjg+NjxZlsXnn38erVq1Wuk4saIGq1Xr60uWlJaW+h8+VSopKXFssEKOD1bEscHKOD5YEccGK+P42LCsyh/LXWATAAAASIpYAQAAACRFrKjBioqK4oILLoiioqLqngqJcWywMo4PVsSxwco4PlgRxwYr4/iouXLZd/1eCAAAAMB65MwKAAAAICliBQAAAJAUsQIAAABIilgBAAAAJEWs2MD9+c9/jnbt2kXdunXjRz/6UTz55JMrHf/444/Hj370o6hbt260b98+rrnmmvU0U9a31Tk2pkyZErlcrtLtn//853qcMevDE088Efvvv3+0atUqcrlcTJo06Tsf432j5ljd48N7R80xcuTI+PGPfxwNGzaM5s2bx0EHHRQzZsz4zsd5/9jwrcmx4b2j5rj66qujc+fOUVJSEiUlJdGjR4944IEHVvoY7xs1h1ixAbv99tvjlFNOiXPOOSdeeeWV2GWXXWKfffaJ9957r8rxs2bNin333Td22WWXeOWVV+I3v/lNnHzyyXHXXXet55mzrq3usbHcjBkzYs6cOfnblltuuZ5mzPqycOHC2H777eNPf/rTKo33vlGzrO7xsZz3jg3f448/HieccEI899xz8fDDD8fSpUtj7733joULF67wMd4/aoY1OTaW896x4WvdunVcfPHF8eKLL8aLL74Ye+yxRxx44IHxxhtvVDne+0YNk7HB6t69e3bcccdVWLbVVltlv/71r6scf+aZZ2ZbbbVVhWXHHntsttNOO62zOVI9VvfYeOyxx7KIyD777LP1MDtSERHZxIkTVzrG+0bNtSrHh/eOmmvevHlZRGSPP/74Csd4/6iZVuXY8N5RszVu3Di74YYbqlznfaNmcWbFBuqrr76Kl156Kfbee+8Ky/fee+945plnqnzMs88+W2l8375948UXX4wlS5ass7myfq3JsbFc165do2XLltGnT5947LHH1uU0+YHwvsGq8N5R8yxYsCAiIpo0abLCMd4/aqZVOTaW895RsyxbtizGjx8fCxcujB49elQ5xvtGzSJWbKA+/vjjWLZsWWy88cYVlm+88cYxd+7cKh8zd+7cKscvXbo0Pv7443U2V9avNTk2WrZsGdddd13cddddMWHChOjYsWP06dMnnnjiifUxZRLmfYOV8d5RM2VZFqeddlr06tUrtttuuxWO8/5R86zqseG9o2Z5/fXXo7i4OIqKiuK4446LiRMnxjbbbFPlWO8bNUud6p4A61Yul6twP8uySsu+a3xVy/nhW51jo2PHjtGxY8f8/R49esT7778fl19+eey6667rdJ6kz/sGK+K9o2Y68cQT47XXXounnnrqO8d6/6hZVvXY8N5Rs3Ts2DGmTZsW8+fPj7vuuisGDRoUjz/++AqDhfeNmsOZFRuoZs2aRe3atSv9pXzevHmVauRyLVq0qHJ8nTp1omnTputsrqxfa3JsVGWnnXaKt956a21Pjx8Y7xusLu8dG7aTTjop7rnnnnjssceidevWKx3r/aNmWZ1joyreOzZchYWFscUWW0S3bt1i5MiRsf3228eoUaOqHOt9o2YRKzZQhYWF8aMf/SgefvjhCssffvjh2Hnnnat8TI8ePSqNf+ihh6Jbt25RUFCwzubK+rUmx0ZVXnnllWjZsuXanh4/MN43WF3eOzZMWZbFiSeeGBMmTIhHH3002rVr952P8f5RM6zJsVEV7x01R5ZlsXjx4irXed+oYarpwp6sB+PHj88KCgqy0aNHZ2+++WZ2yimnZA0aNMhmz56dZVmW/frXv86OPvro/Ph33nknq1+/fnbqqadmb775ZjZ69OisoKAg++tf/1pdT4F1ZHWPjSuuuCKbOHFi9q9//Sv7xz/+kf3617/OIiK76667quspsI58/vnn2SuvvJK98sorWURkf/jDH7JXXnkle/fdd7Ms875R063u8eG9o+b4n//5n6y0tDSbMmVKNmfOnPxt0aJF+THeP2qmNTk2vHfUHGeffXb2xBNPZLNmzcpee+217De/+U1Wq1at7KGHHsqyzPtGTSdWbOD+7//+L9tss82ywsLCbIcddqjwM1GDBg3Kdttttwrjp0yZknXt2jUrLCzM2rZtm1199dXrecasL6tzbFxyySXZ5ptvntWtWzdr3Lhx1qtXr+y+++6rhlmzri3/ubhv3wYNGpRlmfeNmm51jw/vHTVHVcdFRGRjxozJj/H+UTOtybHhvaPmGDp0aP7/H91oo42yPn365ENFlnnfqOlyWfb/X5EEAAAAIAGuWQEAAAAkRawAAAAAkiJWAAAAAEkRKwAAAICkiBUAAABAUsQKAAAAICliBQAAAJAUsQIAAACIiIgnnngi9t9//2jVqlXkcrmYNGnSaj1++PDhkcvlKt0aNGiwWtsRKwCAZPXu3TtOOeWU6p4GANQYCxcujO233z7+9Kc/rdHjhw0bFnPmzKlw22abbeLQQw9dre3ksizL1mgGAADr2KeffhoFBQXRsGHD6p5KJVOmTIndd989Pvvss2jUqFF1TwcA1rpcLhcTJ06Mgw46KL/sq6++inPPPTduvfXWmD9/fmy33XZxySWXRO/evavcxquvvhpdunSJJ554InbZZZdV3ned7zl3AIB1pkmTJtU9hSotWbKkuqcAANViyJAhMXv27Bg/fny0atUqJk6cGP369YvXX389ttxyy0rjb7jhhujQocNqhYoIXwMBABL2za+BtG3bNv73f/83Bg4cGMXFxbHZZpvF3XffHR999FEceOCBUVxcHJ06dYoXX3wx//ixY8dGo0aNYtKkSdGhQ4eoW7du7LXXXvH+++9X2M/VV18dm2++eRQWFkbHjh3j5ptvrrA+l8vFNddcEwceeGA0aNAgjjnmmNh9990jIqJx48aRy+Vi8ODBERHx4IMPRq9evaJRo0bRtGnT2G+//WLmzJn5bc2ePTtyuVxMmDAhdt9996hfv35sv/328eyzz1bY59NPPx277bZb1K9fPxo3bhx9+/aNzz77LCIisiyLSy+9NNq3bx/16tWL7bffPv7617+uldccAFZk5syZcdttt8Wdd94Zu+yyS2y++eYxbNiw6NWrV4wZM6bS+MWLF8ett94aP//5z1d7X2IFAPCDccUVV0TPnj3jlVdeif79+8fRRx8dAwcOjKOOOipefvnl2GKLLWLgwIHxzW+5Llq0KH7729/GuHHj4umnn46ysrI4/PDD8+snTpwYv/rVr+L000+Pf/zjH3HsscfGkCFD4rHHHquw7wsuuCAOPPDAeP311+PCCy+Mu+66KyIiZsyYEXPmzIlRo0ZFxNff9T3ttNPihRdeiEceeSRq1aoVBx98cJSXl1fY3jnnnBPDhg2LadOmRYcOHeKII46IpUuXRkTEtGnTok+fPrHtttvGs88+G0899VTsv//+sWzZsoiIOPfcc2PMmDFx9dVXxxtvvBGnnnpqHHXUUfH444+v/RcdAP5/L7/8cmRZFh06dIji4uL87fHHH68Q5pebMGFCfP755zFw4MDV3pdrVgAAyerdu3d06dIlrrzyymjbtm3ssssu+bMe5s6dGy1btozzzjsvLrzwwoiIeO6556JHjx4xZ86caNGiRYwdOzaGDBkSzz33XOy4444REfHPf/4ztt5665g6dWp07949evbsGdtuu21cd911+f0edthhsXDhwrjvvvsi4uszK0455ZS44oor8mNW9ZoVH330UTRv3jxef/312G677WL27NnRrl27uOGGG/J/aXrzzTdj2223jenTp8dWW20VAwYMiPfeey+eeuqpSttbuHBhNGvWLB599NHo0aNHfvkxxxwTixYtir/85S9r+GoDQEXfvmbF7bffHkceeWS88cYbUbt27Qpji4uLo0WLFhWW9enTJ0pKSmLixImrvW9nVgAAPxidO3fO//fGG28cERGdOnWqtGzevHn5ZXXq1Ilu3brl72+11VbRqFGjmD59ekRETJ8+PXr27FlhPz179syvX+6b21iZmTNnxoABA6J9+/ZRUlIS7dq1i4iI9957b4XPpWXLlhXmvfzMiqq8+eab8eWXX8Zee+1V4a9aN910U5V/1QKAtaVr166xbNmymDdvXmyxxRYVbt8OFbNmzYrHHntsjb4CEuECmwDAD0hBQUH+v3O53AqXffsrF8uXr2jZt9dnWVZp2ar+Pvz+++8fbdq0ieuvvz5atWoV5eXlsd1228VXX331nc9l+bzr1au3wu0vH3PffffFJptsUmFdUVHRKs0RAFbkiy++iLfffjt/f9asWTFt2rRo0qRJdOjQIY488sgYOHBg/P73v4+uXbvGxx9/HI8++mh06tQp9t133/zjbrzxxmjZsmXss88+azQPZ1YAABu0pUuXVrjo5owZM2L+/Pmx1VZbRUTE1ltvXenrFs8880xsvfXWK91uYWFhRET+OhIREZ988klMnz49zj333OjTp09svfXW+Ytiro7OnTvHI488UuW6bbbZJoqKiuK9996r9FetNm3arPa+AOCbXnzxxejatWt07do1IiJOO+206Nq1a5x//vkRETFmzJgYOHBgnH766dGxY8c44IADYurUqRX+b1B5eXmMHTs2Bg8eXOnrIqvKmRUAwAatoKAgTjrppPjjH/8YBQUFceKJJ8ZOO+0U3bt3j4iIM844Iw477LDYYYcdok+fPnHvvffGhAkT4u9///tKt7vZZptFLpeLyZMnx7777hv16tWLxo0bR9OmTeO6666Lli1bxnvvvRe//vWvV3vOZ599dnTq1CmOP/74OO6446KwsDAee+yxOPTQQ6NZs2YxbNiwOPXUU6O8vDx69eoVZWVl8cwzz0RxcXEMGjRojV4nAIj4+npRK7u0ZUFBQYwYMSJGjBixwjG1atWq9Mtbq8uZFQDABq1+/fpx1llnxYABA6JHjx5Rr169GD9+fH79QQcdFKNGjYrLLrsstt1227j22mtjzJgx0bt375Vud5NNNokRI0bEr3/969h4443jxBNPjFq1asX48ePjpZdeiu222y5OPfXUuOyyy1Z7zh06dIiHHnooXn311ejevXv06NEj7r777qhT5+u/M1100UVx/vnnx8iRI2PrrbeOvn37xr333pu/PgYA/ND5NRAAYIM1duzYOOWUU2L+/PnVPRUAYDU4swIAAABIilgBAAAAJMXXQAAAAICkOLMCAAAASIpYAQAAACRFrAAAAACSIlYAAAAASRErAAAAgKSIFQAAAEBSxAoAAAAgKWIFAAAAkJT/D/KDPdF3E2fqAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1200x1200 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cols = (feature_importance_df[[\"Feature\", \"importance\"]]\n",
    "        .groupby(\"Feature\")\n",
    "        .mean()\n",
    "        .sort_values(by=\"importance\", ascending=False)[:25].index)\n",
    "\n",
    "best_features = feature_importance_df.loc[feature_importance_df.Feature.isin(cols)]\n",
    "feature_importance_df.to_csv(path_data+\"/Feature_importance.csv\", index=False)\n",
    "plt.figure(figsize=(12,12))\n",
    "sns.barplot(x=\"importance\",\n",
    "            y=\"Feature\",\n",
    "            data=best_features.sort_values(by=\"importance\",ascending=False))\n",
    "plt.title('LightGBM Features (avg over folds)')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8708913076108127"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mean_squared_error(oof, target)\n",
    "# sub_df = pd.DataFrame({'true':test_target.values})\n",
    "# sub_df['pred'] = predictions\n",
    "# sub_df.to_csv(path_data+\"/predict.csv\", index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.18"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
